package com.example.demo.config.shiro;

import com.example.demo.util.ApplicationContextUtils;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.util.Collection;
import java.util.Set;

/**
 * @Author: yucs
 * @Date: 2021/9/1 22:55
 * 自定义Redis缓存实现，RedisPoolConfig中的配置是用于购物车的配置，此处是用于shiro的缓存配置
 */
public class RedisCache<k,v> implements Cache<k,v> {
    @Override
    public v get(k k) throws CacheException {
        System.out.println("get key:" + k);
        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        return (v) redisTemplate.opsForValue().get(k.toString());
    }

    @Override
    public v put(k k, v v) throws CacheException {
        System.out.println("put key:" + k);
        System.out.println("put value:" + v);
        /**
         * 如需将数据存入redis，就需要和redis通过springboot通过redisTemplate放入缓存
         * 而 redisTemplate 会被自动构建
         * 由于该类不是由工厂管理，所以通过工厂工具类的方式获取
         */
        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
        //key是字符串，v才是对象，因此把key的序列化方式变成字符串的
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //实现put值
        redisTemplate.opsForValue().set(k.toString(),v);
        return null;
    }

    @Override
    public v remove(k k) throws CacheException {
        return null;
    }

    @Override
    public void clear() throws CacheException {

    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public Set<k> keys() {
        return null;
    }

    @Override
    public Collection<v> values() {
        return null;
    }
}
